#include <iostream>
using namespace std;
//实验目的：多态的应用
//实验内容：
//定义类Point，包括：
//两个私有数据成员：int x, int y，它们分别表示一个点的x和y座标。
//构造函数：
//Point(int x, int y)，即传两个参数，构造一个点对象。
//注意，本题要求Point类不得定义缺省构造函数，也就是只定义以上所说的构造函数。
//虚成员函数：
//double getArea()    //获取该图形的面积
//bool isIn(Point p)   //判断传入的点是否在该图形之内（不包括边界），如果在内部返回true，否则返回false
class Point
{
public:
    Point(int x, int y);
    virtual double getArea() const;
    virtual bool isIn(const Point& p) const;
    int getX() const;
    int getY() const;
protected:
    int _x;
    int _y;
};
double Point::getArea() const { return 0; }
bool Point::isIn(const Point& p) const { return 0; }

Point::Point(int x, int y)
    :_x(x)
    ,_y(y)
{}

int Point::getX() const { return _x; }
int Point::getY() const { return _y; }

//定义一个Rectangle类，继承Point类，基类对象的x和y表示长方形左上角的坐标。
//Rectangle类包括：
//两个私有数据成员：int width, int height，它们分别表示长方形的横向的宽度和纵向的高度。
//构造函数：
//Rectangle(int x, int y, int width, int height)。
//成员函数：
//实现double getArea()  和bool isIn(Point p) 函数。
class Rectangle :public Point
{
public:
    Rectangle(int x, int y, int width, int height);
    virtual double getArea() const;
    virtual bool isIn(const Point& p) const;
protected:
    int _width;
    int _height;
};

Rectangle::Rectangle(int x, int y, int width, int height)
    :Point(x, y)
    , _width(width)
    ,_height(height)
{}

double Rectangle::getArea() const
{
    return _width * _height;
}

bool Rectangle::isIn(const Point& p) const
{
    return p.getX() > _x && p.getX() < _x + _width
        && p.getY() > _y && p.getY() < _y + _height;
}

//定义一个Circle类，继承Point类，基类对象的x和y表示圆心的坐标。
//Circle类包括：
//一个私有数据成员： double r，表示圆的半径。
//构造函数：
//Circle(double x, double y, double r)
//成员函数：
//实现double getArea()  和bool isIn(Point p) 函数。计算圆的面积时，PI = 3.14。
class Circle : public Point
{
public:
    Circle(int x, int y, int r);
    virtual double getArea() const;
    virtual bool isIn(const Point& p) const;
private:
    double _r;
};

Circle::Circle(int x, int y, int r)
    :Point(x, y)
    ,_r(r)
{}

double Circle::getArea() const
{
    return 3.14 * _r * _r;
}

bool Circle::isIn(const Point& p) const
{
    int dx = p.getX() - _x;
    int dy = p.getY() - _y;
    return dx * dx + dy * dy < _r * _r;
}


//使用以下main函数测试。
//测试内容为：首先输入一个点p的信息，然后输入若干长方形及圆形，
//Point类型的ppArr指针数组里的元素指向这些对象。
//最后遍历ppArr数组，判断p位于哪些对象之内，然后计算这些对象的面积之和并输出。

//main函数如下：
int main()
{
    int topLeftX, topLeftY, width, height;
    int px, py;
    int op, radius, count = 0;
    Point* ppArr[100];  //声明一个指针数组，最多存放100个Point对象的指针
    double totalArea = 0;

    cin >> px >> py;
    Point p(px, py);

    while (cin >> op)
    {
        switch (op)
        {
        case 1:
        {//往数组里添加元素，指向长方形对象
            cin >> topLeftX >> topLeftY >> width >> height;
            ppArr[count++] = new Rectangle(topLeftX, topLeftY, width, height);
            break;
        }
        case 2:
        {//往数组里添加元素，指向圆形对象
            cin >> px >> py >> radius;
            ppArr[count++] = new Circle(px, py, radius);
            break;
        }
        }
    }
    for (int i = 0; i < count; i++)
    {//遍历ppArr数组，判断p位于哪些对象之内，然后计算这些对象的面积之和
        if (ppArr[i]->isIn(p))
            totalArea += ppArr[i]->getArea();
    }
    cout << totalArea << endl;
    return 0;
}
